#include <iostream>
#include <random>
#include <string>
#include <sstream>
#include <iomanip>
#include <atomic>


static std::string uuid()
{
    // 1.生成8个 0~255 的随机数
    std::random_device rd; // 使用机器码生成随机数，效率低。所以只作为种子使用
    std::mt19937_64 generator(rd()); // 美森旋转算法生成随机数
    std::uniform_int_distribution<int> distribution(0, 255); // 在此范围取值

    std::stringstream ss;
    for (int i = 0; i < 8; i++)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
        // 8-4-4-
        if (i == 3 || i == 5 || i == 7)
            ss << '-';
    }

    // 2.生成一个 8 字节序号
    static std::atomic<size_t> seq(1);
    size_t num = seq.fetch_add(1); // seq为静态，每次生成uuid后都会自增1

    // 取下每一字节，转为16进制
    for (int i = 7; i >= 0; i--)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> i * 8) & 0xff);
        // 4-12
        if (i == 6)
            ss << '-';
    }
    return ss.str();
}

int main()
{
    for (int i = 0; i < 10; i++)
        std::cout << uuid() << std::endl;
    return 0;
}
